home *** CD-ROM | disk | FTP | other *** search
/ Assassins - Ultimate CD Games Collection 4 / Assassins 4 (1999)(Weird Science).iso / misc / omega / source / amiga.c < prev    next >
C/C++ Source or Header  |  1997-05-02  |  26KB  |  941 lines

  1. /* amiga.c */
  2.  
  3. #include <proto/asl.h>
  4. #include <proto/icon.h>
  5. #include <proto/intuition.h>
  6. #include <proto/dos.h>
  7. #include <proto/exec.h>
  8. #include <proto/gadtools.h>
  9. #include <proto/graphics.h>
  10. #include <proto/reqtools.h>
  11. #include <intuition/intuitionbase.h>
  12. #include <libraries/iff.h>
  13. #include <libraries/reqtools.h>
  14. #include <workbench/startup.h>
  15. #include <stdarg.h>
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include "glob.h"
  19.  
  20. #define GFX_DEPTH 4
  21. #define GFX_WIDTH 640
  22. #define GFX_HEIGHT 400
  23.  
  24. /* curses routines */
  25.  
  26. extern WINDOW *Levelw,*Dataw,*Flagw,*Timew,*Menuw,*Locw,*Morew,*Phasew;
  27. extern WINDOW *Comwin,*Msg1w,*Msg2w,*Msg3w,*Msgw;
  28.  
  29. char *login_name = "";
  30.  
  31. WINDOW *newwin(int h,int w,int y,int x);
  32. void touchwin(WINDOW *win);
  33.  
  34. struct Library *IFFBase;
  35. struct Library *AslBase;
  36. struct ReqToolsBase *ReqToolsBase;
  37. struct Screen *Screen;
  38. struct Screen *DefaultPubScreen;
  39. struct Window *Window;
  40. struct Window *OldWindowPtr;
  41. struct RastPort *RPort;
  42. struct BitMap GfxBitMap;
  43. struct Menu *Menus;
  44. struct DiskObject *Icon;
  45. APTR Visual;
  46. ULONG ScreenMode;
  47. int Graphics = 1;
  48.  
  49. USHORT SystemPalette[16];
  50. USHORT CustomPalette[] =
  51. {
  52.   0x0000,0x0432,0x0900,0x0000,0x0765,0x0008,0x0061,0x0999,
  53.   0x0A0C,0x0F00,0x0DB8,0x000F,0x0FC0,0x06F4,0x00BF,0x0FFE
  54. };
  55.  
  56. struct NewMenu NewMenus[] =
  57. {
  58.   { NM_TITLE,"Project",0,0,0,0 },
  59.   { NM_ITEM,"About...","?",0,0,0 },
  60.   { NM_ITEM,"Quit","Q",0,0,0 },
  61.   { NM_END,0,0,0,0,0 }};
  62.  
  63. WINDOW *stdscr;
  64. WINDOW *curscr;
  65. int LINES,COLS;
  66.  
  67. void initscr(void)
  68. {
  69. extern struct IntuitionBase *IntuitionBase;
  70. char prog_name[256];
  71. static WORD pens[] = {-1};
  72. static struct TextAttr topaz8 = { "topaz.font",8,FS_NORMAL,0 };
  73.  
  74.   if (IntuitionBase->LibNode.lib_Version < 37) exit(0);
  75.  
  76.   if (ReqToolsBase == NULL)
  77.     ReqToolsBase = (struct ReqToolsBase *)OpenLibrary("reqtools.library",38);
  78.  
  79.   if (Icon == NULL)
  80.     if (GetProgramName(prog_name,256)) Icon = GetDiskObject(prog_name);
  81.   if (Icon)
  82.   {
  83.   char *icon_str;
  84.  
  85.     if (FindToolType(Icon->do_ToolTypes,"WIZARD")) login_name = "rendell";
  86.  
  87.     if (icon_str = FindToolType(Icon->do_ToolTypes,"GRAPHICS"))
  88.     {
  89.       if (stricmp(icon_str,"NO") == 0) Graphics = 0;
  90.     }
  91.  
  92.     if (icon_str = FindToolType(Icon->do_ToolTypes,"SCREENMODE"))
  93.     {
  94.     ULONG id = INVALID_ID;
  95.     struct NameInfo name;
  96.  
  97.       while ((id = NextDisplayInfo(id)) != INVALID_ID)
  98.       {
  99.     if (GetDisplayInfoData(NULL,(UBYTE *)&name,sizeof(struct NameInfo),
  100.       DTAG_NAME,id))
  101.     {
  102.       if (strcmp(icon_str,name.Name) == 0) ScreenMode = id;
  103.     }
  104.       }
  105.     }
  106.   }
  107.  
  108.   if ((IFFBase = OpenLibrary("iff.library",21)) == NULL) Graphics = 0;
  109.  
  110.   if (Graphics)
  111.   {
  112.   int i;
  113.   IFFL_HANDLE gfx_file;
  114.  
  115.     InitBitMap(&GfxBitMap,GFX_DEPTH,GFX_WIDTH,GFX_HEIGHT);
  116.     for (i = 0; i < GFX_DEPTH; i++)
  117.       if ((GfxBitMap.Planes[i] = AllocRaster(GFX_WIDTH,GFX_HEIGHT)) == NULL)
  118.     exit(0);
  119.  
  120.     if (gfx_file = IFFL_OpenIFF("PROGDIR:Omega.iff",IFFL_MODE_READ))
  121.     {
  122.       if (!IFFL_DecodePic(gfx_file,&GfxBitMap)) Graphics = 0;
  123.       IFFL_CloseIFF(gfx_file);
  124.     }
  125.     else Graphics = 0;
  126.   }
  127.  
  128.   if ((DefaultPubScreen = LockPubScreen(0)) == 0) exit(0);
  129.   if ((Screen = OpenScreenTags(0,
  130.     SA_Font,&topaz8,
  131.     SA_Pens,pens,
  132.     SA_DisplayID,ScreenMode ? ScreenMode :
  133.       GetVPModeID(&DefaultPubScreen->ViewPort),
  134.     SA_Overscan,OSCAN_TEXT,
  135.     SA_Depth,GFX_DEPTH,
  136.     SA_Type,CUSTOMSCREEN|AUTOSCROLL,
  137.     SA_ShowTitle,0,
  138.     SA_Behind,1,TAG_DONE)) == 0) exit(0);
  139.  
  140.   if ((Window = OpenWindowTags(0,
  141.     WA_Left,0,
  142.     WA_Top,0,
  143.     WA_NewLookMenus,1,
  144.     WA_Width,Screen->Width,
  145.     WA_Height,Screen->Height,
  146.     WA_Flags,WFLG_ACTIVATE|WFLG_SMART_REFRESH|WFLG_BORDERLESS|WFLG_BACKDROP,
  147.     WA_IDCMP,IDCMP_VANILLAKEY|IDCMP_MENUPICK,
  148.     WA_CustomScreen,Screen,TAG_DONE)) == 0) exit(0);
  149.  
  150.   SystemPalette[0] = GetRGB4(DefaultPubScreen->ViewPort.ColorMap,0);
  151.   SystemPalette[1] = GetRGB4(DefaultPubScreen->ViewPort.ColorMap,1);
  152.   SystemPalette[2] = GetRGB4(DefaultPubScreen->ViewPort.ColorMap,2);
  153.   SystemPalette[3] = GetRGB4(DefaultPubScreen->ViewPort.ColorMap,3);
  154.   CopyMem(SystemPalette,SystemPalette+12,4*sizeof(USHORT));
  155.   CopyMem(CustomPalette+8,SystemPalette+8,8*sizeof(USHORT));
  156.  
  157.   if ((Visual = GetVisualInfo(Window->WScreen,TAG_DONE)) == 0) exit (0);
  158.   if ((Menus = CreateMenus(NewMenus,GTMN_NewLookMenus,TRUE,TAG_DONE)) == 0)
  159.     exit(0);
  160.   LayoutMenus(Menus,Visual,GTMN_NewLookMenus,TRUE,TAG_DONE);
  161.   SetMenuStrip(Window,Menus);
  162.  
  163.   LoadRGB4(&Screen->ViewPort,CustomPalette,16);
  164.   ScreenToFront(Screen);
  165.  
  166.   RPort = Window->RPort;
  167.   SetDrMd(RPort,JAM2);
  168.   SetAPen(RPort,15);
  169.   SetBPen(RPort,0);
  170.  
  171.   LINES = (Window->Height-Window->BorderTop-Window->BorderBottom)/
  172.     RPort->TxHeight;
  173.   COLS = (Window->Width-Window->BorderLeft-Window->BorderRight)/
  174.     RPort->TxWidth;
  175.  
  176.   stdscr = newwin(LINES,COLS,0,0);
  177.   curscr = stdscr;
  178. }
  179.  
  180. __autoexit void amiga_close(void)
  181. {
  182. int i;
  183.  
  184.   if (Menus) FreeMenus(Menus);
  185.   if (Visual) FreeVisualInfo(Visual);
  186.   if (Window) CloseWindow(Window);
  187.   if (Screen) CloseScreen(Screen);
  188.   for (i = 0; i < GFX_DEPTH; i++)
  189.     if (GfxBitMap.Planes[i])
  190.       FreeRaster(GfxBitMap.Planes[i],GFX_WIDTH,GFX_HEIGHT);
  191.   if (DefaultPubScreen) UnlockPubScreen(0,DefaultPubScreen);
  192.   if (IFFBase) CloseLibrary(IFFBase);
  193.   if (ReqToolsBase) CloseLibrary((struct Library *)ReqToolsBase);
  194.   if (Icon) FreeDiskObject(Icon);
  195. }
  196.  
  197. void amiga_colours(int custom)
  198. {
  199. static USHORT previous;
  200.  
  201.   if (Screen)
  202.     LoadRGB4(&Screen->ViewPort,custom ? CustomPalette : SystemPalette,16);
  203. }
  204.  
  205. void amiga_busy(int busy)
  206. {
  207.   if (Window)
  208.   {
  209.     if (IntuitionBase->LibNode.lib_Version >= 39)
  210.       SetWindowPointer(Window,WA_BusyPointer,busy,TAG_DONE);
  211.   }
  212. }
  213.  
  214. LONG amiga_req(int centre,UBYTE *text,UBYTE *gadgets,...)
  215. {
  216. va_list arguments;
  217. LONG return_value;
  218. static struct EasyStruct requester =
  219.   { sizeof(struct EasyStruct),0,"Omega",0,0 };
  220.  
  221.   amiga_colours(0);
  222.   if (ReqToolsBase == NULL)
  223.   {
  224.     requester.es_TextFormat = text;
  225.     requester.es_GadgetFormat = gadgets;
  226.     va_start(arguments,gadgets);
  227.     amiga_busy(1);
  228.     return_value = EasyRequestArgs(Window,&requester,0,arguments);
  229.     amiga_busy(0);
  230.     va_end(arguments);
  231.   }
  232.   else
  233.   {
  234.     va_start(arguments,gadgets);
  235.     return_value = rtEZRequestTags(text,gadgets,NULL,arguments,
  236.       RT_Window,Window,
  237.       RT_ReqPos,centre ? REQPOS_CENTERSCR : REQPOS_TOPLEFTSCR,
  238.       RT_LockWindow,TRUE,
  239.       RTEZ_ReqTitle,"Omega",TAG_DONE);
  240.     va_end(arguments);
  241.   }
  242.   amiga_colours(1);
  243.   return return_value;
  244. }
  245.  
  246. void amiga_about(void)
  247. {
  248.   amiga_req(0,"Omega 0.80.2\n\n"
  249.           "Written by Laurence R. Brothers\n"
  250.           "and Erik Max Francis\n\n"
  251.           "Amiga release 2 by David Kinder","Continue");
  252. }
  253.  
  254. void endwin(void)
  255. {
  256. }
  257.  
  258. void waddch(WINDOW *win,int c)
  259. {
  260.   switch (c)
  261.   {
  262.     case '\n':
  263.       win->_curx = 0;
  264.       if (win->_cury < win->_maxy) win->_cury++;
  265.       break;
  266.     default:
  267.       if (isprint(c))
  268.       {
  269.         *(win->_text+(win->_cury*(win->_maxx+1))+win->_curx) =
  270.       c+(win->_attr<<8);
  271.     *(win->_lines+win->_cury) = 1;
  272.     if (win->_curx < win->_maxx) win->_curx++;
  273.       }
  274.       break;
  275.   }
  276. }
  277.  
  278. void vwprintw(WINDOW *win,char *format,va_list list)
  279. {
  280. char buffer[256];
  281. int i;
  282.  
  283.   vsprintf(buffer,format,list);
  284.   for (i = 0; i < strlen(buffer); i++) waddch(win,*(buffer+i));
  285. }
  286.  
  287. void draw_cursor(WINDOW *win)
  288. {
  289.   Move(RPort,
  290.     Window->BorderLeft+((win->_offx+win->_curx)*RPort->TxWidth),
  291.     Window->BorderTop+((win->_offy+win->_cury)*RPort->TxHeight));
  292.   if (Graphics && (win == Levelw))
  293.   {
  294.     SetDrMd(RPort,COMPLEMENT);
  295.     Draw(RPort,RPort->cp_x+RPort->TxWidth-1,RPort->cp_y);
  296.     Draw(RPort,RPort->cp_x,RPort->cp_y+RPort->TxHeight-1);
  297.     Draw(RPort,RPort->cp_x-RPort->TxWidth+1,RPort->cp_y);
  298.     Draw(RPort,RPort->cp_x,RPort->cp_y-RPort->TxHeight+1);
  299.     SetDrMd(RPort,JAM2);
  300.     return;
  301.   }
  302.   SetDrMd(RPort,COMPLEMENT);
  303.   RectFill(RPort,RPort->cp_x,RPort->cp_y,
  304.     RPort->cp_x+RPort->TxWidth-1,
  305.     RPort->cp_y+RPort->TxHeight-1);
  306.   SetDrMd(RPort,JAM2);
  307. }
  308.  
  309. int wgetch(WINDOW *win)
  310. {
  311. struct IntuiMessage *imsg;
  312. ULONG class;
  313. UWORD code;
  314.  
  315.   draw_cursor(win);
  316.   for (;;)
  317.   {
  318.     while (imsg = (struct IntuiMessage *)GetMsg(Window->UserPort))
  319.     {
  320.       class = imsg->Class;
  321.       code = imsg->Code;
  322.       if (class == IDCMP_MENUVERIFY) amiga_colours(0);
  323.       ReplyMsg((struct Message *)imsg);
  324.       switch (class)
  325.       {
  326.     case IDCMP_VANILLAKEY:
  327.       if (code == 13) code = 10;
  328.       draw_cursor(win);
  329.       return code;
  330.       break;
  331.     case IDCMP_MENUPICK:
  332.       amiga_colours(1);
  333.       if (code != MENUNULL)
  334.       {
  335.         if (MENUNUM(code) == 0)
  336.         {
  337.           switch (ITEMNUM(code))
  338.           {
  339.         case 0:
  340.           amiga_about();
  341.           break;
  342.         case 1:
  343.           exit(0);
  344.           break;
  345.           }
  346.         }
  347.       }
  348.       break;
  349.       }
  350.     }
  351.     ModifyIDCMP(Window,Window->IDCMPFlags | IDCMP_MENUVERIFY);
  352.     WaitPort(Window->UserPort);
  353.     ModifyIDCMP(Window,Window->IDCMPFlags & ~IDCMP_MENUVERIFY);
  354.   }
  355. }
  356.  
  357. void getyx(WINDOW *win,int *y,int *x)
  358. {
  359.   *y = win->_cury;
  360.   *x = win->_curx;
  361. }
  362.  
  363. void werase(WINDOW *win)
  364. {
  365. int i;
  366.  
  367.   for (i = 0; i < (win->_maxx+1)*(win->_maxy+1); i++)
  368.     *(win->_text+i) = SPACE;
  369.   for (i = 0; i <= win->_maxy; i++) *(win->_lines+i) = 1;
  370.   win->_curx = 0;
  371.   win->_cury = 0;
  372. }
  373.  
  374. void wprintw(WINDOW *win,char *format,...)
  375. {
  376. va_list arg;
  377.  
  378.   va_start(arg,format);
  379.   vwprintw(win,format,arg);
  380.   va_end(arg);
  381. }
  382.  
  383. void findchar(int c,int *x,int *y)
  384. {
  385.   *x = 0;
  386.   switch (c)
  387.   {
  388.     /* Objects */
  389.     case FLOOR:        *x = 144; *y =  40; break;
  390.     case PLAYER:       *x =  32; *y = 136; break;
  391.     case SPACE:        *x =  32; *y =  40; break;
  392.     case WALL:           *x =  48; *y =  32; break;
  393.     case PORTCULLIS:   *x =  40; *y =  40; break;
  394.     case OPEN_DOOR:    *x =  88; *y =  40; break;
  395.     case CLOSED_DOOR:  *x = 120; *y =  40; break;
  396.     case WHIRLWIND:    *x = 280; *y = 264; break;
  397.     case ABYSS:        *x = 264; *y =  32; break;
  398.     case LAVA:         *x =  72; *y =  40; break;
  399.     case HEDGE:        *x = 152; *y =  40; break;
  400.     case WATER:        *x =  48; *y =  40; break;
  401.     case FIRE:         *x =  80; *y = 160; break;
  402.     case TRAP:         *x = 272; *y =  48; break;
  403.     case LIFT:         *x = 208; *y =  40; break;
  404.     case STAIRS_UP:    *x = 256; *y =  40; break;
  405.     case STAIRS_DOWN:  *x = 272; *y =  40; break;
  406.     case CORPSE:       *x =  88; *y = 120; break;
  407.     case STATUE:       *x =  96; *y =  40; break;
  408.     case RUBBLE:       *x = 240; *y =  40; break;
  409.     case ALTAR:        *x = 192; *y =  40; break;
  410.     case CASH:         *x = 136; *y =  32; break;
  411.     case PILE:         *x = 216; *y =  32; break;
  412.     case FOOD:         *x = 200; *y = 112; break;
  413.     case WEAPON:       *x =  80; *y = 104; break;
  414.     case MISSILEWEAPON:*x = 184; *y = 104; break;
  415.     case SCROLL:       *x =  32; *y =  80; break;
  416.     case POTION:       *x =  88; *y =  80; break;
  417.     case ARMOR:        *x = 272; *y =  96; break;
  418.     case SHIELD:       *x = 184; *y =  96; break;
  419.     case CLOAK:        *x = 192; *y =  96; break;
  420.     case BOOTS:        *x = 104; *y =  96; break;
  421.     case STICK:        *x = 144; *y = 104; break;
  422.     case RING:         *x =  56; *y =  48; break;
  423.     case THING:        *x = 208; *y =  32; break;
  424.     case ARTIFACT:     *x = 272; *y =  80; break;
  425.     case CHAIR:        *x = 264; *y =  48; break;
  426.     case SAFE:         *x = 256; *y =  48; break;
  427.     case FURNITURE:    *x = 248; *y =  48; break;
  428.     case BED:          *x = 240; *y =  48; break;
  429.     /* Terrain */
  430.     case PLAINS:       *x =  80; *y =  40; break;
  431.     case TUNDRA:       *x = 104; *y =  40; break;
  432.     case MOUNTAINS:    *x = 112; *y =  48; break;
  433.     case PASS:         *x =  48; *y =  32; break;
  434.     case CITY:         *x = 112; *y =  40; break;
  435.     case VILLAGE:            /* Also snowball weapon */
  436.       if (Current_Environment == E_COUNTRYSIDE)
  437.     { *x = 160; *y =  40; } else { *x = 176; *y =  72; }
  438.       break;
  439.     case FOREST:       *x = 152; *y =  40; break;
  440.     case JUNGLE:       *x = 224; *y = 184; break;
  441.     case SWAMP:        *x = 136; *y =  40; break;
  442.     case VOLCANO:            /* Also succubus */
  443.       if (Current_Environment == E_COUNTRYSIDE)
  444.     { *x = 48; *y = 184; } else { *x = 56; *y = 280; }
  445.       break;
  446.     case CASTLE:       *x = 112; *y =  40; break;
  447.     case TEMPLE:       *x = 192; *y =  40; break;
  448.     case CAVES:        *x = 272; *y =  40; break;
  449.     case DESERT:       *x = 264; *y =  40; break;
  450.     case CHAOS_SEA:    *x = 280; *y =  40; break;
  451.     case STARPEAK:     *x = 280; *y =  88; break;
  452.     case DRAGONLAIR:   *x = 144; *y =  32; break;
  453.     case MAGIC_ISLE:   *x =  64; *y =  32; break;
  454.     /* Magic weapons */
  455.     case ('*'|COL_LIGHT_RED):    *x = 136; *y =  72; break;
  456.     case ('^'|COL_LIGHT_BLUE):    *x = 160; *y =  72; break;
  457.     case ('!'|COL_BROWN):    *x = 152; *y =  72; break;
  458.     case ('@'|COL_PURPLE):    *x =  48; *y = 128; break;
  459.     /* Monsters */
  460.     case ('@'|COL_RED):        *x =  88; *y = 136; break;
  461.     case ('A'|COL_GREY|COL_BG_WHITE):
  462.                  *x = 240; *y = 224; break;
  463.     case ('A'|COL_LIGHT_BLUE|COL_BG_WHITE):
  464.                 *x = 280; *y = 256; break;
  465.     case ('A'|COL_WHITE|COL_BG_BLUE):
  466.                 *x =  40; *y = 272; break;
  467.     case ('A'|COL_YELLOW|COL_BG_WHITE):
  468.                 *x = 208; *y = 144; break;
  469.     case ('B'|COL_BLACK|COL_BG_BROWN):
  470.                 *x = 176; *y = 224; break;
  471.     case ('B'|COL_GREEN):    *x = 256; *y = 168; break;
  472.     case ('C'|COL_GREEN):    *x = 256; *y = 168; break;
  473.     case ('C'|COL_GREY|COL_BG_BROWN):
  474.                 *x = 176; *y = 176; break;
  475.     case ('D'|COL_BLACK|COL_BG_RED):
  476.                 *x =  32; *y = 280; break;
  477.     case ('D'|COL_BLACK|COL_BG_WHITE):
  478.                 *x = 200; *y = 224; break;
  479.     case ('D'|COL_BRIGHT_WHITE|COL_BG_RED):
  480.                 *x = 120; *y = 152; break;
  481.     case ('D'|COL_GREY|COL_BG_RED):
  482.                 *x = 192; *y = 152; break;
  483.     case ('E'|COL_BLACK|COL_BG_WHITE):
  484.                 *x =  96; *y = 224; break;
  485.     case ('E'|COL_BROWN|COL_BG_WHITE):
  486.                 *x = 112; *y = 256; break;
  487.     case ('E'|COL_WHITE|COL_BG_BROWN):
  488.                 *x =  72; *y = 272; break;
  489.     case ('F'|COL_BLACK|COL_BG_WHITE):
  490.                 *x =  40; *y = 168; break;
  491.     case ('F'|COL_GREY):    *x = 152; *y = 200; break;
  492.     case ('F'|COL_GREY|COL_BG_RED):
  493.                 *x = 216; *y = 144; break;
  494.     case ('F'|COL_LIGHT_BLUE|COL_BG_WHITE):
  495.                 *x = 192; *y = 256; break;
  496.     case ('F'|COL_LIGHT_RED|COL_BG_WHITE):
  497.                 *x = 264; *y = 256; break;
  498.     case ('F'|COL_WHITE|COL_BG_RED):
  499.                 *x =  56; *y = 272; break;
  500.     case ('G'|COL_GREEN):       *x =  64; *y = 240; break;
  501.     case ('G'|COL_GREY|COL_BG_GREEN):
  502.                 *x = 144; *y = 192; break;
  503.     case ('G'|COL_RED):         *x = 256; *y = 248; break;
  504.     case ('I'|COL_RED):        *x =  56; *y = 280; break;
  505.     case ('J'|COL_BROWN|COL_BG_RED):
  506.                 *x = 192; *y = 216; break;
  507.     case ('J'|COL_GREY|COL_BG_BROWN):
  508.                 *x = 104; *y = 224; break;
  509.     case ('K'|COL_LIGHT_GREEN):    *x =  72; *y = 240; break;
  510.     case ('L'|COL_BLACK|COL_BG_WHITE):
  511.                 *x = 104; *y = 160; break;
  512.     case ('L'|COL_BRIGHT_WHITE|COL_BG_BLUE):
  513.                 *x = 256; *y = 256; break;
  514.     case ('M'|COL_BLUE):    *x =  64; *y = 160; break;
  515.     case ('M'|COL_PURPLE|COL_BG_WHITE):
  516.                 *x =  40; *y = 280; break;
  517.     case ('M'|COL_YELLOW):    *x = 264; *y = 208; break;
  518.     case ('N'|COL_BLACK|COL_BG_WHITE):
  519.                 *x = 232; *y = 256; break;
  520.     case ('P'|COL_PURPLE):    *x = 168; *y = 152; break;
  521.     case ('R'|COL_GREY):        *x = 192; *y = 264; break;
  522.     case ('R'|COL_YELLOW|COL_BG_WHITE):
  523.                 *x = 160; *y = 168; break;
  524.     case ('S'|COL_BLACK|COL_BG_WHITE):
  525.                 *x = 200; *y = 152; break;
  526.     case ('S'|COL_GREEN|COL_BG_RED):
  527.                 *x =  96; *y = 216; break;
  528.     case ('S'|COL_GREY):    *x = 184; *y = 200; break;
  529.     case ('S'|COL_GREY|COL_BG_GREEN):
  530.                 *x = 176; *y = 240; break;
  531.     case ('S'|COL_RED):        *x =  56; *y = 280; break;
  532.     case ('S'|COL_YELLOW|COL_BG_BROWN):
  533.                 *x =  88; *y = 264; break;
  534.     case ('T'|COL_BROWN):    *x =  72; *y = 272; break;
  535.     case ('T'|COL_GREEN|COL_BG_BROWN):
  536.                 *x =  88; *y = 208; break;
  537.     case ('T'|COL_GREY):    *x =  72; *y = 200; break;
  538.     case ('T'|COL_LIGHT_GREEN|COL_BG_BLUE):
  539.                 *x = 192; *y = 240; break;
  540.     case ('T'|COL_YELLOW|COL_BG_BLUE):
  541.                 *x = 200; *y = 232; break;
  542.     case ('T'|COL_YELLOW|COL_BG_WHITE):
  543.                 *x = 120; *y = 256; break;
  544.     case ('U'|COL_BLACK|COL_BG_WHITE):
  545.                 *x = 152; *y = 168; break;
  546.     case ('V'|COL_BLACK|COL_BG_RED):
  547.                 *x =  80; *y = 264; break;
  548.     case ('V'|COL_GREY):    *x = 160; *y = 200; break;
  549.     case ('W'|COL_BLUE|COL_BG_WHITE):
  550.                 *x = 232; *y = 248; break;
  551.     case ('W'|COL_GREEN|COL_BG_RED):
  552.                 *x = 224; *y = 216; break;
  553.     case ('W'|COL_GREY|COL_BG_RED):
  554.                 *x = 184; *y = 240; break;
  555.     case ('W'|COL_LIGHT_RED):    *x = 232; *y = 152; break;
  556.     case ('W'|COL_WHITE|COL_BG_BLUE):
  557.                 *x =  32; *y = 272; break;
  558.     case ('Z'|COL_BLACK|COL_BG_WHITE):
  559.                 *x = 200; *y = 224; break;
  560.     case ('a'|COL_BROWN):       *x = 264; *y = 144; break;
  561.     case ('a'|COL_GREY):    *x = 208; *y = 206; break;
  562.     case ('a'|COL_RED):         *x = 176; *y = 208; break;
  563.     case ('a'|COL_YELLOW):    *x =  64; *y = 176; break;
  564.     case ('a'|COL_YELLOW|COL_BG_WHITE):
  565.                 *x = 208; *y = 144; break;
  566.     case ('b'|COL_BRIGHT_WHITE|COL_FG_BLINK):
  567.                 *x = 104; *y = 192; break;
  568.     case ('b'|COL_BROWN):       *x = 264; *y = 144; break;
  569.     case ('b'|COL_CYAN):        *x = 120; *y =  48; break;
  570.     case ('b'|COL_GREEN):       *x = 144; *y = 152; break;
  571.     case ('b'|COL_GREY):    *x = 232; *y = 176; break;
  572.     case ('b'|COL_RED):        *x =  32; *y = 256; break;
  573.     case ('b'|COL_YELLOW|COL_BG_BROWN):
  574.                 *x = 216; *y = 168; break;
  575.     case ('c'|COL_BROWN):       *x = 144; *y = 208; break;
  576.     case ('c'|COL_GREEN):    *x =  96; *y = 216; break;
  577.     case ('c'|COL_RED):        *x =  64; *y = 128; break;
  578.     case ('d'|COL_BLACK|COL_BG_WHITE):
  579.                 *x = 136; *y = 200; break;
  580.     case ('d'|COL_BROWN):       *x = 104; *y = 152; break;
  581.     case ('d'|COL_LIGHT_RED):    *x = 272; *y = 216; break;
  582.     case ('e'|COL_GREEN):       *x =  64; *y = 224; break;
  583.     case ('e'|COL_GREY):        *x = 128; *y =  48; break;
  584.     case ('e'|COL_RED):         *x =  48; *y = 264; break;
  585.     case ('f'|COL_CYAN):        *x = 104; *y = 144; break;
  586.     case ('f'|COL_GREY):        *x =  72; *y = 144; break;
  587.     case ('f'|COL_LIGHT_BLUE):    *x = 176; *y = 272; break;
  588.     case ('f'|COL_PURPLE):      *x = 224; *y = 168; break;
  589.     case ('f'|COL_WHITE):    *x = 216; *y = 224; break;
  590.     case ('f'|COL_YELLOW|COL_BG_WHITE):
  591.                 *x = 184; *y = 144; break;
  592.     case ('g'|COL_BROWN):       *x = 168; *y = 248; break;
  593.     case ('g'|COL_GREEN):       *x =  56; *y = 240; break;
  594.     case ('g'|COL_GREY):        *x = 136; *y = 200; break;
  595.     case ('g'|COL_WHITE):       *x =  56; *y = 136; break;
  596.     case ('h'|COL_BROWN):       *x = 104; *y = 152; break;
  597.     case ('h'|COL_GREY):    *x = 208; *y = 200; break;
  598.     case ('h'|COL_YELLOW):    *x = 200; *y = 160; break;
  599.     case ('i'|COL_BLACK|COL_BG_WHITE):
  600.                 *x = 120; *y = 168; break;
  601.     case ('j'|COL_PURPLE):    *x = 224; *y = 216; break;
  602.     case ('l'|COL_BLUE):    *x =  80; *y = 128; break;
  603.     case ('l'|COL_YELLOW):    *x = 136; *y =  48; break;
  604.     case ('m'|COL_GREY):    *x = 208; *y = 200; break;
  605.     case ('m'|COL_PURPLE):    *x = 224; *y = 168; break;
  606.     case ('m'|COL_RED):        *x = 136; *y = 184; break;
  607.     case ('m'|COL_RED|COL_BG_WHITE):
  608.                  *x = 176; *y = 200; break;
  609.     case ('n'|COL_BLACK|COL_BG_WHITE):
  610.                 *x = 208; *y = 256; break;
  611.     case ('n'|COL_GREY):        *x = 200; *y = 224; break;
  612.     case ('n'|COL_RED):        *x =  32; *y = 264; break;
  613.     case ('p'|COL_GREY):    *x =  88; *y = 200; break;
  614.     case ('p'|COL_PURPLE):      *x =  48; *y = 224; break;
  615.     case ('p'|COL_RED):         *x = 240; *y = 168; break;
  616.     case ('q'|COL_BROWN):       *x = 232; *y = 208; break;
  617.     case ('s'|COL_GREEN):    *x = 120; *y = 240; break;
  618.     case ('s'|COL_LIGHT_RED):   *x = 136; *y = 184; break;
  619.     case ('s'|COL_RED):        *x =  32; *y = 264; break;
  620.     case ('s'|COL_WHITE):       *x =  48; *y = 208; break;
  621.     case ('s'|COL_YELLOW):    *x = 144; *y = 224; break;
  622.     case ('r'|COL_BLACK|COL_BG_BROWN):
  623.                 *x = 248; *y = 200; break;
  624.     case ('r'|COL_BROWN):       *x =  64; *y = 152; break;
  625.     case ('r'|COL_GREY|COL_BG_BROWN):
  626.                 *x = 112; *y = 272; break;
  627.     case ('t'|COL_BROWN):    *x =  32; *y = 248; break;
  628.     case ('t'|COL_CYAN):        *x = 120; *y =  48; break;
  629.     case ('t'|COL_GREEN):       *x =  42; *y = 192; break;
  630.     case ('t'|COL_LIGHT_BLUE):    *x = 248; *y = 152; break;
  631.     case ('t'|COL_PURPLE):      *x = 248; *y = 160; break;
  632.     case ('w'|COL_BROWN):       *x =  40; *y = 152; break;
  633.   }
  634. }
  635.  
  636. void printchrs(WINDOW *win,int f,int b,char *s,int l,char a)
  637. {
  638.   if (Graphics && (win == Levelw))
  639.   {
  640.   int i;
  641.  
  642.     for (i = 0; i < l; i++)
  643.     {
  644.     int x,y;
  645.  
  646.       findchar(*(s+i)+(a<<8),&x,&y);
  647.       if (x == 0)
  648.       {
  649.     SetAPen(RPort,f);
  650.     RectFill(RPort,RPort->cp_x+(i*RPort->TxWidth),
  651.           RPort->cp_y-RPort->TxBaseline,
  652.       RPort->cp_x+((i+1)*RPort->TxWidth)-1,
  653.       RPort->cp_y-RPort->TxBaseline+RPort->TxHeight-1);
  654.       }
  655.       else BltBitMapRastPort(&GfxBitMap,x,y,RPort,
  656.     RPort->cp_x+(i*RPort->TxWidth),RPort->cp_y-RPort->TxBaseline,
  657.     8,8,0xC0);
  658.     }
  659.     Move(RPort,RPort->cp_x+(l*RPort->TxWidth),RPort->cp_y);
  660.   }
  661.   else
  662.   {
  663.     SetAPen(RPort,f);
  664.     SetBPen(RPort,b);
  665.     Text(RPort,s,l);
  666.   }
  667. }
  668.  
  669. void chrsout(WINDOW *win,int y)
  670. {
  671. static int fore_col[] = { 3,5,6,11,2,8,4,15,7,14,13,14,9,9,12,15 };
  672. static int back_col[] = { 3,5,6,11,2,8,4,15,3 };
  673.  
  674. char buffer[256];
  675. int c,i,j;
  676. char attr,prev_attr;
  677.  
  678.   prev_attr = ((*(win->_text+((win->_maxx+1)*y)))&0xFF00)>>8;
  679.   j = 0;
  680.   Move(RPort,
  681.     Window->BorderLeft+(win->_offx*RPort->TxWidth),
  682.     Window->BorderTop+((win->_offy+y)*RPort->TxHeight)+RPort->TxBaseline);
  683.  
  684.   for (i = 0; i <= win->_maxx; i++)
  685.   {
  686.     c = *(win->_text+((win->_maxx+1)*y)+i);
  687.     attr = (c&0xFF00)>>8;
  688.  
  689.     if (c == *(win->_disp+((win->_maxx+1)*y)+i))
  690.     {
  691.       if (j > 0)
  692.       {
  693.     printchrs(win,*(fore_col+(prev_attr&0x0F)),
  694.       *(back_col+((prev_attr&0xF0)>>4)),buffer,j,prev_attr);
  695.         j = 0;
  696.       }
  697.       Move(RPort,RPort->cp_x+RPort->TxWidth,RPort->cp_y);
  698.     }
  699.     else
  700.     {
  701.       if (attr != prev_attr)
  702.       {
  703.     if (j > 0)
  704.     {
  705.       printchrs(win,*(fore_col+(prev_attr&0x0F)),
  706.         *(back_col+((prev_attr&0xF0)>>4)),buffer,j,prev_attr);
  707.           j = 0;
  708.     }
  709.       }
  710.  
  711.       *(buffer+j++) = c&0x00FF;
  712.     }
  713.     prev_attr = attr;
  714.   }
  715.  
  716.   if (j > 0)
  717.     printchrs(win,*(fore_col+(prev_attr&0x0F)),
  718.       *(back_col+((prev_attr&0xF0)>>4)),buffer,j,prev_attr);
  719. }
  720.  
  721. void wrefresh(WINDOW *win)
  722. {
  723. int i;
  724.  
  725.   if (win == stdscr || win == Menuw)
  726.   {
  727.     touchwin(Msgw);
  728.     touchwin(Msg1w);
  729.     touchwin(Msg2w);
  730.     touchwin(Msg3w);
  731.     touchwin(Levelw);
  732.     touchwin(Timew);
  733.     touchwin(Flagw);
  734.     touchwin(Dataw);
  735.     touchwin(Locw);
  736.     touchwin(Morew);
  737.     touchwin(Phasew);
  738.     touchwin(Comwin);
  739.     touchwin(Menuw); 
  740.     touchwin(stdscr);
  741.   }
  742.  
  743.   for (i = 0; i <= win->_maxy; i++)
  744.   {
  745.     if (*(win->_lines+i) != 0)
  746.     {
  747.       chrsout(win,i);
  748.       *(win->_lines+i) = 0;
  749.     }
  750.   }
  751.   for (i = 0; i < (win->_maxx+1)*(win->_maxy+1); i++)
  752.     *(win->_disp+i) = *(win->_text+i);
  753. }
  754.  
  755. void wmove(WINDOW *win,int y,int x)
  756. {
  757.   if (y > win->_maxy) y = win->_maxy;
  758.   if (x > win->_maxx) x = win->_maxx;
  759.   win->_cury = y;
  760.   win->_curx = x;
  761. }
  762.  
  763. void wattrset(WINDOW *win,int attr)
  764. {
  765.   win->_attr = attr;
  766. }
  767.  
  768. void touchwin(WINDOW *win)
  769. {
  770. int i;
  771.  
  772.   for (i = 0; i < (win->_maxx+1)*(win->_maxy+1); i++)
  773.     *(win->_disp+i) = '\0';
  774.   for (i = 0; i <= win->_maxy; i++) *(win->_lines+i) = 1;
  775. }
  776.  
  777. WINDOW *newwin(int h,int w,int y,int x)
  778. {
  779. WINDOW *new;
  780.  
  781.   if ((new = malloc(sizeof(WINDOW))) == NULL) exit(0);
  782.   new->_cury = 0;
  783.   new->_curx = 0;
  784.   new->_maxy = h-1;
  785.   new->_maxx = w-1;
  786.   new->_offy = y;
  787.   new->_offx = x;
  788.   if ((new->_text = malloc(w*h*sizeof(int))) == NULL) exit(0);
  789.   if ((new->_disp = calloc(w*h*sizeof(int),1)) == NULL) exit(0);
  790.   if ((new->_lines = malloc(h)) == NULL) exit(0);
  791.   wattrset(new,COL_WHITE>>8);
  792.   werase(new);
  793.   return new;
  794. }
  795.  
  796. void scrollok(WINDOW *win,int ok)
  797. {
  798. }
  799.  
  800. void wstandout(WINDOW *win)
  801. {
  802.   if (win == Levelw) return;
  803.   win->_attr = (COL_BG_WHITE|COL_BLACK)>>8;
  804. }
  805.  
  806. void wstandend(WINDOW *win)
  807. {
  808.   if (win == Levelw) return;
  809.   win->_attr = (COL_BG_BLACK|COL_WHITE)>>8;
  810. }
  811.  
  812. void waddstr(WINDOW *win,char *s)
  813. {
  814.   wprintw(win,s);
  815. }
  816.  
  817. void clear(void)
  818. {
  819.   werase(stdscr);
  820. }
  821.  
  822. void printw(char *format,...)
  823. {
  824. va_list arg;
  825.  
  826.   va_start(arg,format);
  827.   vwprintw(stdscr,format,arg);
  828.   va_end(arg);
  829. }
  830.  
  831. void refresh(void)
  832. {
  833.   wrefresh(stdscr);
  834. }
  835.  
  836. void move(int y,int x)
  837. {
  838.   wmove(stdscr,y,x);
  839. }
  840.  
  841. int getch(void)
  842. {
  843.   wgetch(stdscr);
  844. }
  845.  
  846. void noecho(void)
  847. {
  848. }
  849.  
  850. void crmode(void)
  851. {
  852. }
  853.  
  854. /* file routines */
  855.  
  856. char *getlogin(void)
  857. {
  858.   return login_name;
  859. }
  860.  
  861. int getpid(void)
  862. {
  863.   return 0;
  864. }
  865.  
  866. int chown(char *o,int u,int g)
  867. {
  868.   return 0;
  869. }
  870.  
  871. int file_req(char *buffer)
  872. {
  873. static char *title = "Restore an Omega Game";
  874. int rcode = 0;
  875.  
  876.   if (ReqToolsBase)
  877.   {
  878.   static char file[108];
  879.   struct rtFileRequester *freq;
  880.  
  881.     if (freq = (struct rtFileRequester *)rtAllocRequest(RT_FILEREQ,TAG_DONE))
  882.     {
  883.       strcpy(file,"");
  884.       if (rcode = (int)rtFileRequest(freq,file,title,TAG_DONE))
  885.       {
  886.     strcpy(buffer,freq->Dir);
  887.     AddPart(buffer,file,256);
  888.       }
  889.       rtFreeRequest(freq);
  890.     }
  891.   }
  892.   else
  893.   {
  894.   struct FileRequester *freq;
  895.  
  896.     if (AslBase = OpenLibrary("asl.library",37))
  897.     {
  898.       if (freq = AllocAslRequestTags(ASL_FileRequest,
  899.     ASLFR_RejectIcons,1,TAG_DONE))
  900.       {
  901.     if (rcode = AslRequestTags(freq,ASLFR_TitleText,title,TAG_DONE))
  902.     {
  903.       strcpy(buffer,freq->fr_Drawer);
  904.       AddPart(buffer,freq->fr_File,256);
  905.     }
  906.     FreeAslRequest(freq);
  907.       }
  908.       CloseLibrary(AslBase);
  909.     }
  910.   }
  911.   return rcode;
  912. }
  913.  
  914. int wbmain(struct WBStartup *wbmsg)
  915. {
  916. char restore[256];
  917. char *argv[2];
  918. int argc = 1;
  919.  
  920.   Icon = GetDiskObject(wbmsg->sm_ArgList[0].wa_Name);
  921.  
  922.   ReqToolsBase = (struct ReqToolsBase *)OpenLibrary("reqtools.library",38);
  923.   if (amiga_req(1,
  924.     "Omega 0.80.2\n\n"
  925.     "Written by Laurence R. Brothers\n"
  926.     "and Erik Max Francis\n\n"
  927.     "Amiga version by David Kinder\n\n"
  928.     "Do you wish to start a new game or\n"
  929.     "restore a previously saved game?","New|Restore") == 0)
  930.   {
  931.     if (file_req(restore))
  932.     {
  933.       argc = 2;
  934.       argv[1] = restore;
  935.     }
  936.   }
  937.   argv[0] = "Omega";
  938.   main(argc,argv);
  939.   exit(0);
  940. }
  941.